package com.are.odisea;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;
import java.util.ArrayList;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class SrvBandejas
 */
@WebServlet("/SrvBandejas")
public class SrvBandejas extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public SrvBandejas() {
        super();
        // TODO Auto-generated constructor stub
    }
    
    protected void ProcesarPeticion(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
    	response.setContentType("text/html;charset=ISO-8859-1");
		PrintWriter out = response.getWriter();
		
		HttpSession sesion=request.getSession();
		if (sesion.getAttribute("usuario") == null) {
			out.print("La sesion ha caducado... intente de nuevo por favor");
			return ;
		}
		
		String usuario = (String)sesion.getAttribute("usuario");

		String operacion = (String)request.getParameter("operacion");
		db conexion = null;
		try {
			
			conexion = new db();
			
			if (operacion.equals("add")) {  // Agregar Bandeja
				String nombre = (String)request.getParameter("nombre");
				String tipo = (String)request.getParameter("tipo");
				String estado = (String)request.getParameter("estado");
				String hora_inicial = (String)request.getParameter("hora_inicial");
				String hora_final = (String)request.getParameter("hora_final");
				
				Bandeja bandeja = new Bandeja();
				bandeja.setNombre(nombre);
				bandeja.setEstado(Integer.parseInt(estado));
				bandeja.setTipo(Integer.parseInt(tipo));
				bandeja.setUsuario(usuario);
				bandeja.setHora_inicial(hora_inicial);
				bandeja.setHora_final(hora_final);
				
				GestionBandeja gb = new GestionBandeja(conexion,bandeja);
				if (gb.Add()) {
					out.print("OK");
				}else {
					out.print("Error al procesar la solicitud");
				}
			}
			
			if (operacion.equals("update")) {  // Actualizar bandeja
				String nombre = (String)request.getParameter("nombre");
				String tipo = (String)request.getParameter("tipo");
				String estado = (String)request.getParameter("estado");
				String id = (String)request.getParameter("id");
				String hora_inicial = (String)request.getParameter("hora_inicial");
				String hora_final = (String)request.getParameter("hora_final");
				
				Bandeja bandeja = new Bandeja();
				bandeja.setNombre(nombre);
				bandeja.setEstado(Integer.parseInt(estado));
				bandeja.setTipo(Integer.parseInt(tipo));
				bandeja.setHora_inicial(hora_inicial);
				bandeja.setHora_final(hora_final);
				
				GestionBandeja gb = new GestionBandeja(conexion,bandeja);
				if (gb.exist(id)) {
					if (gb.Update(id)) {
						out.print("OK");
					}else {
						out.print("Error al procesar la solicitud");
					}
				}else {
					throw new SQLException("Id de bandeja no existe");
				}
			}
			
			if (operacion.equals("remove")) {  // Eliminar Bandeja
				String id = (String)request.getParameter("id");
				GestionBandeja gb = new GestionBandeja(conexion);
				if (gb.exist(id)) {
					if (gb.Remove(id)) {
						out.print("OK");
					}else {
						out.print("Error al procesar la solicitud");
					}
				}else {
					throw new SQLException("Id de bandeja no existe");
				}
			}
			
			if (operacion.equals("list")) {
				
				GestionBandeja gb = new GestionBandeja(conexion);
				ArrayList<Bandeja> lista = gb.List();
				out.println("<h2>Listado de Bandejas</h2>");
				out.println("Total registros: " + lista.size());
				out.println("<table>");
				out.println("<tr>");
				out.println("<th>Id</th>");
				out.println("<th>Nombre</th>");
				out.println("<th>Estado</th>");
				out.println("<th>Tipo</th>");
				out.println("<th>Hora Inicial</th>");
				out.println("<th>Hora Final</th>");
				out.println("<th>Fecha Creacion</th>");
				out.println("<th>Usuario creacion</th>");
				out.println("<th>Accion</th>");
				out.println("</tr>");
				int fila = 1;
				for (Bandeja bandeja : lista) {
					out.println("<tr " + (fila%2==0?"class='odd'":"") + ">");
					out.println("<td>" + bandeja.getId() +"</td>");
					out.println("<td>" + bandeja.getNombre() + "</td>");
					out.println("<td>" + (bandeja.getEstado()==1?"<img alt=\"Online\" src=\"images/online.png\">":"<img alt=\"Offline\" src=\"images/offline.png\">") +  "</td>");
					out.println("<td>" + (bandeja.getTipo()==2?"Mantenimiento":"Instalaciones") + "</td>");
					out.println("<td>" + bandeja.getHora_inicial() + "</td>");
					out.println("<td>" + bandeja.getHora_final() + "</td>");
					out.println("<td>" + bandeja.getFecha() + "</td>");
					out.println("<td>" + bandeja.getUsuario() + "</td>");
					out.println("<td><a href=\"modificarbandeja.jsp?id=" + bandeja.getId() + "\"  >Modificar</a> <a href=\"javascript:eliminar('" + bandeja.getId() + "')\"  >Eliminar</a> <a href=\"TransferirBandeja.jsp?id=" + bandeja.getId() + "\"  >Transferir</a></td>");
					out.println("</tr>");
					fila ++;
				}
				
				out.println("<tr>");
				out.println("<td colspan=\"9\">Total registros: " + lista.size() + "</td>");
				out.println("</tr>");
				
				out.println("</table>");
				
				
			}
			
			if (operacion.equals("add_user")) {  // Asignar bandeja a usuario
				String user = (String)request.getParameter("usuario");
				String bandeja = (String)request.getParameter("bandeja");
				GestionBandeja gb = new GestionBandeja(conexion);
				if (gb.exist(bandeja)) {
					if (gb.AsignarUsuario(bandeja, user)) {
						out.print("OK");
					}else {
						out.print("Error al procesar la solicitud");
					}
				}else {
					throw new SQLException("Id de bandeja no existe");
				}
			}
			
			if (operacion.equals("remove_user")) {  //Eliminar usuario de la bandeja
				String id = (String)request.getParameter("id");
				GestionBandeja gb = new GestionBandeja(conexion);
				
					if (gb.removeUsuario(id)) {
						out.print("OK");
					}else {
						out.print("Error al procesar la solicitud");
					}
				
			}
			
			if (operacion.equals("lista_usuarios")) {
				String id = (String)request.getParameter("id");
				GestionBandeja gb = new GestionBandeja(conexion);
				ArrayList<BandejaUsuario> lista = gb.listUsuarios(id);
				if (lista.size() > 0 ) {
				out.println("<table>");
				out.println("<tr>");
				out.println("<th>Usuario</th>");
				
				out.println("<th>Accion</th>");
				out.println("</tr>");
				
				for (BandejaUsuario item : lista) {
					out.println("<tr>");
					out.println("<td>" + item.getUsuario() + "</td>");
					out.println("<td><a href=\"javascript:remove_usuario('" + item.getId() + "')\"  >Eliminar</a></td>");
					out.println("</tr>");
					
				}
				
				out.println("<tr>");
				out.println("<td colspan=\"2\">Total registros: " + lista.size() + "</td>");
				out.println("</tr>");
				
				out.println("</table>");
				}else {
					out.print("<strong>No hay departamentos asignados</strong>");
				}
				
			}
			
			if (operacion.equals("add_departamento")) {  // Asignar departamento a bandeja
				String bandeja = (String)request.getParameter("bandeja");
				String departamento = (String)request.getParameter("departamento");
				
				GestionBandeja gb = new GestionBandeja(conexion);
				if (gb.exist(bandeja)) {
					if (gb.AsignarDepartamento(bandeja, departamento)) {
						out.print("OK");
					}else {
						out.print("Error al procesar la solicitud");
					}
				}else {
					throw new SQLException("Id de bandeja no existe");
				}
			}
			
			if (operacion.equals("remove_departamento")) {  //Eliminar usuario de la bandeja
				String id = (String)request.getParameter("id");
				GestionBandeja gb = new GestionBandeja(conexion);
				
					if (gb.removeDepartamento(id)) {
						out.print("OK");
					}else {
						out.print("Error al procesar la solicitud");
					}
				
			}
			
			if (operacion.equals("lista_departamentos")) {
				String id = (String)request.getParameter("id");
				GestionBandeja gb = new GestionBandeja(conexion);
				ArrayList<BandejaDepartamento> lista = gb.listDepartamento(id);
				if (lista.size() > 0 ) {
				out.println("<table>");
				out.println("<tr>");
				out.println("<th>Codigo</th>");
				out.println("<th>Departamento</th>");
				out.println("<th>Accion</th>");
				out.println("</tr>");
				
				for (BandejaDepartamento item : lista) {
					out.println("<tr>");
					out.println("<td>" + item.getDepartamento() + "</td>");
					out.println("<td>" + item.getNombreDepartamento() + "</td>");
					out.println("<td><a href=\"javascript:remove_departamento('" + item.getId() + "')\"  >Eliminar</a></td>");
					out.println("</tr>");
					
				}
				
				out.println("<tr>");
				out.println("<td colspan=\"3\">Total registros: " + lista.size() + "</td>");
				out.println("</tr>");
				
				out.println("</table>");
				}else {
					out.print("<strong>No hay departamentos asignados</strong>");
				}
				
			}
			
			if (operacion.equals("transferir")) {
				String bandeja_origen = (String)request.getParameter("bandeja_origen");
				String bandeja_destino = (String)request.getParameter("bandeja_destino");
				
				if (bandeja_origen.equals(bandeja_destino)) {
					throw new SQLException("La bandeja destino debe ser diferente a la bandeja origen");
				}
				
				conexion = new db();
				GestionBandeja gb = new GestionBandeja(conexion);
				if (gb.TransferirOrdenesBandeja(Integer.parseInt(bandeja_origen), Integer.parseInt(bandeja_destino))) {
					conexion.Commit();
					out.print("OK");
				}else {
					conexion.Rollback();
					out.print("Error al procesar la solicitud");
				}
				
				
			}
			
			if (operacion.equals("distribuir")) {
				String departamento = (String)request.getParameter("departamento");
				String tipo = (String)request.getParameter("tipo");
				conexion = new db();
				GestionBandeja gb = new GestionBandeja(conexion);
				if (gb.DistribuirOrdenesBandeja(Integer.parseInt(tipo), departamento)) {
					conexion.Commit();
					out.print("OK");
				}else {
					conexion.Rollback();
					out.print("Error al procesar la solicitud");
				}
				
				
			}
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			out.println("Error de conexion. " + e.getMessage());
		} finally {
			if (conexion != null) {
				try {
					conexion.Close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					out.println("Error de conexion. " + e.getMessage());
				}
			}
		}
		
		
		
		
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		this.ProcesarPeticion(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		this.ProcesarPeticion(request, response);
	}

}
